/*!
 @header
 @abstract 对网络请求的封装
 @author shadow, 15-06-25 14:06:40

 @version 1.0
 */
#import <Foundation/Foundation.h>

@class AFHTTPRequestOperation;

/*!
 @enmu
 @abstract 返回数据的编码方式
 */
typedef NS_ENUM(NSUInteger, TMTEncodingType) {
    /*!
     @enmu
     @abstract 对数据不做格式化
     */
    TMTEncodingTypeNone,
    /*!
     @enmu
     @abstract XML
     */
    TMTEncodingTypeXML,
    /*!
     @enmu
     @abstract JSON
     */
    TMTEncodingTypeJSON,
};

/*!
 @enmu
 @abstract 请求数据的编码方式
 */
typedef NS_ENUM(NSUInteger, TMTRequestType) {
    /*!
     @enmu
     @abstract 普通form格式
     */
    TMTRequestTypeForm,
    /*!
     @enmu
     @abstract JSON
     */
    TMTRequestTypeJSON,
    /*!
     @enmu
     @abstract 二进制格式
     */
    TMTRequestTypeData,
    /*!
     @enmu
     @abstract Plist格式
     */
    TMTRequestTypePlist,
};

/*!
 @enmu
 @abstract 网络状态
 */
typedef NS_ENUM(NSUInteger, TMTNetworkStatus) {
    /*!
     @enmu
     @abstract 无网络
     */
    TMTNetworkStatusNotReachable,
    /*!
     @enmu
     @abstract WIFI
     */
    TMTNetworkStautsWiFi,
    /*!
     @enmu
     @abstract WWAN
     */
    TMTNetworkStatusWWAN
};

/*!
 @class
 @abstract 网络请求封装类
 */
@interface TMTNetwork : NSObject
/*!
 @property
 @abstract 请求根地址
 */
@property(nonatomic, copy) NSString *baseURLPath;

/**!
 @property
 @abstract 判断请求路径是否是相对的。如果urlRelative为YES，在发起请求的时候，路径需要baseURLPath + url。
           如果urlRelative为NO，发起请求的时候直接用url
 */
@property(nonatomic, assign) BOOL urlRelative;

/*!
 @property
 @abstract 网络状态
 */
@property(nonatomic) TMTNetworkStatus status;

/*!
 @property
 @abstract 响应编码格式  None | JSON | XML
 */
@property(nonatomic) TMTEncodingType responseEncodingType;

/*!
 @property
 @abstract 请求参数编码格式  Data | JSON | Plist
 */
@property(nonatomic) TMTRequestType requestType;

/*!
 @method
 @abstract 获取TMTNetwork实例
 @discussion 单例
 
 @return TMTNetwork实例
 */
+ (TMTNetwork *)sharedNetwork;

/*!
 @method
 @abstract 取消请求
 @discussion
 
 @param url    请求路径
 */
- (void)cancelWithURL:(NSString *)url;

/*!
 @method
 @abstract 取消全部请求
 @discussion 取消全部请求
 */
- (void)cancelAllRequest;

/*!
 @method
 @abstract 开启网络监听
 @discussion
 */
- (void)launchNetworkStatusListener;

/*!
 @method
 @abstract   公共的请求头
 @discussion
       [@"User-Agent",@"Accept-Encoding", @"Content-Encoding",@"Content-Type",@"Set-Cookie"]
 @param header
 */
- (void)prepareCommonHeader:(NSDictionary *)header;

/*!
 @method
 @abstract      GET请求
 @discussion    GET请求
 
 @param url     请求路径
 @param params  请求参数
 @param success 请求成功后的回调
 @param failure 请求失败后的回调
 */
- (void)getWithURL:(NSString *)url
            params:(id)params
           success:(void (^)(id responseData))success
           failure:(void (^)(NSError *error))failure;

/*!
 @method
 @abstract      POST请求
 @discussion    POST请求
 
 @param url     请求路径
 @param params  请求参数
 @param success 请求成功后的回调
 @param failure 请求失败后的回调
 */
- (void)postWithURL:(NSString *)url
             params:(id)params
            success:(void (^)(id responseData))success
            failure:(void (^)(NSError *error))failure;

/*!
@method
@abstract      POST请求(上AE.zip传文件数据)
@discussion    POST请求(上AE.zip传文件数据)

@param url     请求路径
@param params  请求参数
@param success 请求成功后的回调
@param failure 请求失败后的回调
*/
- (void)postWithURL:(NSString *)url
             params:(NSDictionary *)params
      formDataArray:(NSArray *)formDataArray
            success:(void (^)(id responseData))success
            failure:(void (^)(NSError *error))failure;

/*!
 @method
 @abstract      HEAD请求
 @discussion    HEAD请求
 
 @param url     请求路径
 @param params  请求参数
 @param success 请求成功后的回调
 @param failure 请求失败后的回调
 */
- (void)headWithURL:(NSString *)url
             params:(NSDictionary *)params
            success:(void (^)(AFHTTPRequestOperation *operation))success
            failure:(void (^)(NSError *error))failure;

/*!
 @method
 @abstract      PUT请求
 @discussion    PUT请求
 
 @param url     请求路径
 @param params  请求参数
 @param success 请求成功后的回调
 @param failure 请求失败后的回调
 */
- (void)putWithURL:(NSString *)url
            params:(id)params
           success:(void (^)(id responseData))success
           failure:(void (^)(NSError *error))failure;

/*!
 @method
 @abstract      PATCH请求
 @discussion    PATCH请求
 
 @param url     请求路径
 @param params  请求参数
 @param type    编码格式  JSON | XML
 @param success 请求成功后的回调
 @param failure 请求失败后的回调
 */
- (void)patchWithURL:(NSString *)url
              params:(id)params
             success:(void (^)(id responseData))success
             failure:(void (^)(NSError *error))failure;

/*!
 @method
 @abstract      DELETE请求
 @discussion    DELETE请求
 
 @param url     请求路径
 @param params  请求参数
 @param success 请求成功后的回调
 @param failure 请求失败后的回调
 */
- (void)deleteWithURL:(NSString *)url
               params:(id)params
              success:(void (^)(id responseData))success
              failure:(void (^)(NSError *error))failure;

@end
